perm filename PUB2.SAI[OK,TES]2 blob
sn#117735 filedate 1974-08-26 generic text, type T, neo UTF8
00100 BEGIN "PUB2"
00200 REQUIRE "VERSION" SOURCE!FILE;
00300 REQUIRE 6500 STRING!SPACE ;
00400 COMMENT The Document Compiler -- Pass Two ;
00500 COMMENT TES 6/11/74 added XGP Left Margin to: ;
00600 COMMENT PASS 1 OUTPUT FORMAT FOR EACH PAGE :
00700 Height Width XGPLeftMargin
00800 For each area:
00900 UpperLine NumCols NumLines
01000 For each column:
01100 LeftChar
01200 For each non-null line: LineNo SHORTM Index of PUInS.PUI line
01300 0
01400 -10
01500
01600 PASS 2 reads the output file name and the intermediate page file names from
01700 PUPSEQ.PUI, and the label table from PULABL.PUI. Then it reads
01800 each page from each page file, processes each line in each of
01900 its areas, and writes out a line printer image on the output file.
02000
02100 Each line is subject to three operations, in this order:
02200 (1) Substitute label values at each vertical tab.
02300 (2) Justify the line, if required, by inserting spaces at word breaks marked by altmodes.
02400 (3) Generate underlining and super/sub-scripting as indicated by rubouts.
02500
02600 ;
02700
02800 DEFINE THRU = "STEP 1 UNTIL", DOWN = "STEP -1 UNTIL",
02900 TES = "COMMENT", RKJ = "COMMENT", TVR = "COMMENT", PJ = "COMMENT",
03000 ie = "COMMENT", AWHILE = "WHILE TRUE",
03100 INP(BRKTBL) = "INPUT(SCHAN, BRKTBL)", INNUM = "WORDIN(ICHAN)",
03200 SCN(BRKTBL)="(IF FROMFILE THEN INPUT(SCHAN,BRKTBL) ELSE SCAN(OWL,BRKTBL,PAGEBRC))",
03300 SCNUM = "CVD(SCN(TO!ALTMODE!SKIP))",
03400 LPT = "1", TTY = "2", MIC = "3", XGP = "4",
03500 HORIZ="'40", VERTI="'41", CSIZE="'42", ULINE="'43", RSPCS="'44",
03600 LSPCS="'45", UDOTS="'46", RDOTS="'47", comment FR80 escape codes ;
03700 FULSTR(X) = "LENGTH(X)", NULSTR(X) = "(LENGTH(X)=0)",
03800 CR = "'15", LF = "'12", VT = "'13", FF = "'14", SP = "'40",
03900 RUBOUT = "'177", TB = "'11",
04000 ALTMODE = IFC TENEX THENC "'33" ELSEC
04100 IFC VERSION=SAILVER THENC "'175" ELSEC "'176" ENDC
04200 ENDC,
04300 TO!ALTMODE!SKIP = "1", TO!LF!APPD = "2",
04400 ONE!CHAR = "3", BREAKER = "4", TO!RUB!ALT!SKIP = "5",
04500 LOCAL!TABLE = "6",
04600 FIML = "256",
04700 ANS(A) = "(S = ""A"" OR S = ""A"" + '40)";
04800 DEFINE COMMENT FOR XGP;
04900 USEA="('177&'14)", USEB="('177&'15)", VSB="('177&'20)",
05000 XTAB="('177&'30)",
05100 XGPNUM(N)="((N LSH -7) & N)";
05200 DEFINE ESCAPE1="('177&'1)", ESCAPE2="('177&'2)";
05300 DEFINE CTLF="6", CTLE="5", CTLT="'24", CTLQ="'21";
05400
05410 IFC VERSION = SAILVER THENC DEFINE RPGEXT = """.RPG""" ; ENDC
05420
05500 PJ 5/28/74 ; DEFINE
05600 PUIEXT = IFC VERSION=ITSVER THENC """ PUI""" ELSEC """.PUI""" ENDC,
05700 OCTEXT = IFC VERSION=ITSVER THENC """ OCT""" ELSEC """.OCT""" ENDC,
05800 TXTEXT = IFC VERSION=ITSVER THENC """ TXT""" ELSEC """.TXT""" ENDC;
05900
06000 TES 1/7/74 ; DEFINE CTLC="3", CTLH="'10", CTLR="'22", CTLU="'25", CTLS="'23" ;
06100 INTEGER IML, IMC, comment, no. of lines and chars per page image ;
06200 DEBUG, DEVICE, SEQCHAN, SEQBRC, SEQEOF, comment PUPSEQ.PUI info ;
06300 LFTMAR, comment XGP left margin (for tabs) ;
06400 INTRA, comment TES 6/11/74 PARC XGP Intra-line spacing (normally 3) ;
06500 LISTCHAN, comment output file ;
06600 BAR, TES underlining character (or 0 if OFF) 10/22/73;
06700 PAGEHIGH, PAGEWIDE, comment IML and IMC for latest page ;
06800 I, J, K, L, M, N, DUMMY, comment general-purpose ;
06900 LABCHAN, LABBRC, LABEOF, comment PULABL.PUI info ;
07000 NL, comment LABTAB upper bound ; PAGECT, comment counts pages ;
07100 TABLE, comment LABTAB first subscript -- selects Pass 1 NUMBER vs ITBL ;
07200 ICHAN, SCHAN, FROMFILE, PAGEBRC, PAGEEOF, comment PUIn[S].PUI info ;
07300 TOPLINE, NCOLS, NLINES, comment Area info ;
07400 COL, LEFTCH, comment Column info ;
07500 SLIDETOP, comment top of ∞ stacks such as SLIDESG ;
07600 NCSIZE,CCSIZE, NHORIZ,CHORIZ, NVERTI,CVERTI, comment microfilm normal/current settings ;
07700 NEEDCR, comment, assures CR before every LF for Stanford LPT ;
07800 CHARW, LINENO, SHORTM, SH, BRKS, FSTBRK, CHRS, FSTCHRS, SG, NOTFST, comment, Line info ;
07900 TERM, TERMX, LINE, UNDERLINE, CHAR, F, G, LAST, LASL, AVAIL ; comment, Justify info ;
08000
08100 INTEGER SCRIPT, comment baseline adjustment ;
08200 THISFONT, comment PARC font number for scripts;
08300 SCRLVL, comment baseline level ;
08400 BASELINE ; comment useful? for underscore at stanford ;
08500
08600 INTEGER TLFTMAR ; TVR temporary left margin in XGP pts;
08700 BOOLEAN DOPASS3; RKJ: 1-4-74 flag for PASS 3 at CMU;
08800 BOOLEAN XCRIBL ; RKJ: 1-9-74 contains "DEVICE=XGP" ;
08900
09000 INTEGER FLUSHING, FSIZE; comment kludges for XGP ;
09100 EXTERNAL INTEGER RPGSW ;
09200
09300 IFC VERSION=PARCVER AND NOT TENEX THENC
09400 SIMPLE PROCEDURE FOOBAZ;
09500 START!CODE "FOOBAZ"
09600 LABEL EVEC,GO,STRT,REEN;
09700 EVEC: JRST STRT;
09800 JRST REEN;
09900 HRRZ 1,'120;
10000 JRST 1(1);
10100 STRT: HRRZ 1,'120;
10200 JRST (1);
10300 REEN: HRRZ 1,'124;
10400 JRST (1);
10500 GO: MOVEI 1,'400000;
10600 MOVEI 2,EVEC;
10700 HRLI 2,3;
10800 '104000000204;
10900 '104000000170;
11000 END "FOOBAZ";
11100 ENDC
00100 STRING TMPFILE, LISTFILE, PAGEFILE, IFILE, SFILE, S,
00200 OWL, SS, T, ENDLINE, RESTARTLINE, ENDPAGE, DELINT, CRLF, JOBNO ;
00300 TES 1/7/74 ; STRING CMDFILE ;
00400 TES 3/20/74 ; STRING IFILENAME ; INTEGER IFICHAN ;
00500
00600
00700 REAL RATIO ;
00800
00900 INTEGER ARRAY CHARTBL[0:127], XFILL,XINF,SLIDESG,RB,LBD[1:5] ;
01000
01100 STRING ARRAY LBF[1:5] ;
01200
01300 INTEGER SIMPLE PROCEDURE READIN(STRING FILENAME; BOOLEAN BINARY ; REFERENCE INTEGER BRC, EOF) ;
01400 BEGIN "READIN"
01500 INTEGER CH ;
01600 CH ← GETCHAN ; EOF ← 0 ; OPEN(CH, "DSK", IF BINARY THEN 8 ELSE 0,2,0,150, BRC, EOF) ;
01700 LOOKUP(CH, FILENAME, 0) ; RETURN(CH) ;
01800 END "READIN" ;
01900
02000 INTEGER SIMPLE PROCEDURE WRITEON(STRING FILENAME) ;
02100 IFC TENEX THENC
02200 OPENFILE(FILENAME, "WC") ;
02300 ELSEC
02400 BEGIN "WRITEON"
02500 INTEGER CH ;
02600 CH ← GETCHAN ; OPEN(CH, "DSK", 0,0,2,0, 0, 0) ;
02710 AWHILE DO RKJ: 23-JUL-74 - CHECK FOR ENTER FAILURE ;
02720 BEGIN
02730 ENTER(CH, FILENAME, DUMMY←0);
02740 IF NOT DUMMY THEN DONE;
02750 OUTSTR("Cannot ENTER """ & FILENAME & """ Write file: ");
02760 FILENAME←INCHWL;
02770 END;
02780 RETURN(CH);
02800 END "WRITEON" ;
02900 ENDC
03000
03100 SIMPLE PROCEDURE WARN(STRING MESSG) ; OUTSTR(MESSG&CR&LF) ;
03200
03300 SIMPLE PROCEDURE IMPOSSIBLE(STRING HOW) ; WARN("Impossible case index for "&HOW) ;
03400 STRING SIMPLE PROCEDURE MICROFILM(INTEGER OP, ARG) ;
03500 RETURN('177 & OP & (IF OP≤'42 THEN (ARG DIV 128)&(ARG MOD 128) ELSE ARG)) ;
03600 STRING SIMPLE PROCEDURE SETSIZE(INTEGER N) ; RETURN(MICROFILM(CSIZE, CCSIZE ← N)) ;
03700 STRING SIMPLE PROCEDURE SETHORIZ(INTEGER N) ; RETURN(MICROFILM(HORIZ, CHORIZ ← N)) ;
03800 STRING SIMPLE PROCEDURE SETVERTI(INTEGER N) ; RETURN(MICROFILM(VERTI, CVERTI ← N)) ;
03900 STRING SIMPLE PROCEDURE DOULINE(INTEGER N) ; RETURN(MICROFILM(ULINE, N)) ;
04000 STRING SIMPLE PROCEDURE DORSPCS(INTEGER N) ; RETURN(MICROFILM(RSPCS, N)) ;
04100 STRING SIMPLE PROCEDURE DOLSPCS(INTEGER N) ; RETURN(MICROFILM(LSPCS, N)) ;
04200 STRING SIMPLE PROCEDURE DOUDOTS(INTEGER N) ; RETURN(MICROFILM(UDOTS, N)) ;
04300 STRING SIMPLE PROCEDURE DORDOTS(INTEGER N) ; RETURN(MICROFILM(RDOTS, N)) ;
04400
04500 RECURSIVE STRING PROCEDURE VARBLANK(INTEGER N);
04600 BEGIN "VARBLANK"
04700 IFC VERSION=CMUVER THENC
04800 IF N ≤ 0 THEN RETURN(NULL) ELSE
04900 IF N ≥ 128 THEN RETURN(VSB & 127 & VARBLANK(N-127)) ELSE
05000 RETURN(VSB&N)
05100 ELSEC IFC VERSION=SAILVER OR VERSION=ITSVER THENC
05200 IF N ≤ 0 THEN RETURN(NULL) ELSE
05300 IF N ≥ 64 THEN RETURN(ESCAPE2 & 63 & VARBLANK(N-63)) ELSE
05400 RETURN(ESCAPE2&N)
05500 ELSEC IFC VERSION=PARCVER THENC
05600 RETURN(CTLE&CVS(N)&".")
05700 ENDC ENDC ENDC;
05800 END "VARBLANK";
05900
06000 PRELOAD!WITH "", " ", " ", " ", " ", " ", " ",
06100 " ", " ", " ", " " ;
06200 SAFE STRING ARRAY SPSARR[0:10] ;
06300
06400 INTERNAL STRING SIMPLE PROCEDURE SPS(INTEGER N) ; IF N≤10 THEN RETURN(SPSARR[N MAX 0])
06500 ELSE IF DEVICE=MIC THEN RETURN(DORSPCS(N))
06600 ELSE BEGIN
06700 STRING S ; INTEGER I ;
06800 S ← SPSARR[10] ;
06900 FOR I ← 11 THRU N DO S ← S & SP ;
07000 RETURN(S) ;
07100 END ;
07200
07300 IFC TENEX THENC
07400 STRING PROCEDURE SCANTO(STRING BRKS; REFERENCE STRING SCANNEE; BOOLEAN INCLUDE) ;
07500 BEGIN
07600 INTEGER DUMMY ;
07700 SETBREAK(LOCAL!TABLE, BRKS, NULL, IF INCLUDE THEN "IA" ELSE "IR") ;
07800 RETURN(SCAN(SCANNEE, LOCAL!TABLE, DUMMY)) ;
07900 END ;
08000 ENDC
00100 COMMENT I N I T I A L I Z E ;
00200 IFC VERSION=PARCVER THENC
00300 DUMMY←CVSIX("PUB2 ");
00400 START!CODE
00500 MOVE 1,DUMMY;
00600 '104000000210;
00700 END;
00800 ENDC
00900
01000 SCRIPT ← 10;
01100 IFC TENEX THENC JOBNO ← CVS(GJINF(DUMMY, DUMMY, DUMMY)) ; ENDC TES 10/25/73 ;
01200
01300 IFC VERSION=PARCVER THENC IML←65; IMC←72; ENDC
01400 IFC VERSION=SAILVER THENC IML←53; IMC←69; ENDC
01500 IFC VERSION=ITSVER THENC IML←55; IMC←69; ENDC PJ 5/28/74 ;
01600 IFC VERSION=CMUVER THENC IML←55; IMC←69; ENDC
01700 PAGEHIGH ← PAGEWIDE ← PAGECT ← 0 ; CRLF ← CR & LF ;
01800 SETBREAK(ONE!CHAR, NULL, NULL, "XA") ;
01900 SETBREAK(TO!ALTMODE!SKIP, ALTMODE, NULL, "IS") ;
02000 SETBREAK(TO!LF!APPD, LF, NULL, "IA") ;
02100 SETBREAK(BREAKER, RUBOUT&VT&ALTMODE&CR&LF, NULL, "IS") ;
02200 SETBREAK(TO!RUB!ALT!SKIP, RUBOUT&ALTMODE, NULL, "IS") ;
02300 IFC TENEX THENC
02400 IF RPGSW THEN
02500 BEGIN
02600 IFICHAN ← READIN(JOBNO & ".PASS2", FALSE, DUMMY, DUMMY) ;
02700 IFILENAME ← INPUT(IFICHAN, TO!ALTMODE!SKIP) ;
02800 RELEASE(IFICHAN) ; TES 6/11/74 ;
02900 END
03000 ELSE BEGIN TES 6/11/74 REVISED ;
03100 OUTSTR("MANUSCRIPT: ") ;
03200 WHILE -1 = (J ←
03300 GTJFNL(NULL, '162000000000, '100000101,
03400 NULL, NULL, NULL, "PUB", NULL, NULL, NULL)) DO
03500 OUTSTR(" ?" & CRLF & "MANUSCRIPT: ") ;
03600 IFILENAME ← JFNS(J, '1000000000) ;
03700 END ;
03800 ENDC
03900 OUTSTR("PASS TWO: ") ;
04000 SEQCHAN ← READIN(
04100 IFC TENEX THENC IFILENAME&".FILES" ELSEC "PUPSEQ"&PUIEXT ENDC,
04200 FALSE, SEQBRC, SEQEOF) ;
04300 TMPFILE ← INPUT(SEQCHAN, TO!ALTMODE!SKIP) ;
04400 LISTFILE ← INPUT(SEQCHAN, TO!ALTMODE!SKIP) ;
04500 DEBUG ← CVD(INPUT(SEQCHAN, TO!ALTMODE!SKIP)) ;
04600 DEVICE ← CVD(INPUT(SEQCHAN, TO!ALTMODE!SKIP)) ;
04700 DELINT ← INPUT(SEQCHAN, TO!ALTMODE!SKIP) ;
04800 IFC VERSION = PARCVER OR VERSION = SAILVER OR VERSION = ITSVER THENC TES 1/7/74 ;
04900 IF DEVICE=XGP THEN CMDFILE ← INPUT(SEQCHAN, TO!ALTMODE!SKIP) ENDC ;
05000 BAR ← INPUT(SEQCHAN, TO!ALTMODE!SKIP)[1 FOR 1] ;
05100 IF BAR = SP THEN BAR ← 0 ; TES 10/22/73 ;
05200 CHARW ← CVD(INPUT(SEQCHAN, TO!ALTMODE!SKIP));
05300 LFTMAR←CVD(INPUT(SEQCHAN, TO!ALTMODE!SKIP));
05400 INTRA←CVD(INPUT(SEQCHAN, TO!ALTMODE!SKIP)); TES 6/11/74 ;
05500 BASELINE←CVD(INPUT(SEQCHAN, TO!ALTMODE!SKIP)); BASELINE←BASELINE+(BASELINE DIV 4);
05600 DOPASS3←CVD(INPUT(SEQCHAN, TO!ALTMODE!SKIP)); RKJ: 1-4-74;
05700 XCRIBL ← DEVICE=XGP ; RKJ: 1-9-74 got tired of writing conditional ; PJ 5/29/74 moved ;
05800 IF ¬RPGSW AND NOT XCRIBL THEN COMMENT STARTED BY ".R PUB2" ;
05900 DO BEGIN
06000 OUTSTR("OUTPUT DEVICE (LPT, TTY or MIC): ") ;
06100 S ← INCHWL ;
06200 DEVICE ← IF ANS(L) THEN LPT ELSE IF ANS(T) THEN TTY ELSE
06300 IF ANS(M) THEN MIC ELSE IF ANS(X) THEN XGP ELSE 0;
06400 END
06500 UNTIL DEVICE ;
06600 IF ¬RPGSW AND DEBUG THEN
06700 IF DEVICE = MIC THEN DEBUG ← 0
06800 ELSE DO BEGIN
06900 OUTSTR("Debug info in right margin? (Y or N) = ") ;
07000 S ← INCHWL ;
07100 DEBUG ← IF ANS(Y) THEN -1 ELSE IF ANS(N) THEN 0 ELSE 100 ;
07200 END
07300 UNTIL DEBUG < 100 ;
07400 ENDLINE ← LF ; ENDPAGE ← FF ;
07500 RESTARTLINE ←
07600 IFC PARCVER THENC IF XCRIBL THEN CTLT&"0." ELSE CR
07700 ELSEC CR ENDC ; TES 11/1/73 ;
07800 CASE DEVICE-1 OF
07900 BEGIN "DEV"
08000 comment 1...LPT ; LISTCHAN ← WRITEON(LISTFILE) ;
08100 comment 2...TTY ; LISTCHAN ← WRITEON(LISTFILE) ;
08200 comment 3...MIC ; BEGIN IML ← IMC ← 1 ; LISTCHAN ← WRITEON(TMPFILE) ;
08300 IF DEBUG THEN BEGIN WARN("Won't put Debug info on Microfilm") ;
08400 DEBUG ← FALSE ; END END ;
08500 COMMENT 4...XGP ; LISTCHAN ← WRITEON(LISTFILE)
08600 END "DEV" ;
08700 IFC TENEX THENC LISTFILE ← JFNS(LISTCHAN, 0) ; ENDC
08800 OUTSTR(LISTFILE) ;
08900 J ← 0 ; FOR K ← RUBOUT, ALTMODE, VT, CR, LF DO CHARTBL[K] ← J ← J + 1 ;
09000 LABCHAN ← READIN(
09100 IFC TENEX THENC IFILENAME&".LABELS" ELSEC "PULABL"&PUIEXT ENDC,
09200 FALSE, LABBRC, LABEOF) ;
09300 NL ← CVD(INPUT(LABCHAN, TO!ALTMODE!SKIP)) ;
09400 LASL ← 1000 ; comment, last physical line occupied on the page ;
09500 S←INPUT(SEQCHAN,TO!LF!APPD); comment get to right place ;
09600 TES 1/7/74 ADDED : TES 6/11/74 WITH INTRA:;
09700 IFC VERSION = PARCVER THENC
09800 IF XCRIBL THEN OUT(LISTCHAN,
09900 (RUBOUT&CTLC) & CMDFILE &
10000 ("K EFHJLMQRSTU" & CR & "I " & CVS(INTRA) &
10050 CR & "M 0" & CR & "W 1600" & CR & "E" & CR)) ;
10100 COMMENT
10200 CTLC Initiallize switches (used as RUBOUT CTLC)
10300 CTLE Variable blank
10400 CTLF Font change
10500 CTLH Overstrike
10600 CTLJ=LF Line Feed
10700 CTLL=FF Form Feed
10800 CTLM=CR Carriage Return
10900 CTLQ Quote control character
11000 CTLR Return to baseline from ript
11100 CTLS Subscript
11200 CTLT Tab
11300 CTLU Superscript
11400 RUBOUT Treat as control character (inverse CTLQ)
11500 ;
11600 ENDC
11700
11800 IFC VERSION = SAILVER THENC
11900 IF XCRIBL THEN OUT(LISTCHAN, "/LMAR="&CVS(LFTMAR)&CMDFILE&CRLF&FF) ;
12000 ENDC
13000 IFC VERSION=ITSVER THENC PJ 8/24/74 ;
13100 IF XCRIBL THEN OUT(LISTCHAN,";LFTMAR "&CVS(LFTMAR)&CRLF&
13200 ";VSP "&CVS(INTRA)&CRLF&
13300 ";SKIP 1"&CRLF&
13400 CMDFILE&CRLF&FF);
13500 ENDC
00100 BEGIN "INNER BLOCK"
00200
00300 STRING ARRAY LABTAB[0:1, 0:NL], OWLS[0:FIML-1] ;
00400
00500 AWHILE DO
00600 BEGIN "LABEL"
00700 TABLE ← CVD(INPUT(LABCHAN, TO!ALTMODE!SKIP)) ; IF LABEOF THEN DONE ;
00800 LABTAB[TABLE, CVD(INPUT(LABCHAN, TO!ALTMODE!SKIP))] ←
00900 INPUT(LABCHAN, TO!ALTMODE!SKIP) &
01000 (IF XCRIBL THEN
01100 (ALTMODE & INPUT(LABCHAN, TO!ALTMODE!SKIP))
01200 ELSE NULL);
01300 END "LABEL" ;
01400
01500 RELEASE(LABCHAN);
01600
01700 COMMENT G O ! ;
01800 DO comment, This loop is re-entered only if page image grows ;
01900 BEGIN "SIZE"
02000 SAFE STRING ARRAY IMG[1:IML+IML], SEG[0:IMC+IMC], SRCREF[1:IML] ;
02100 SAFE INTEGER ARRAY LINK,FAKE,LASC[1:IML+IML] ;
02200 LABEL CONTINUE ;
02300
02400 INTEGER SIMPLE PROCEDURE APPD(STRING S) ;
02500 BEGIN "APPD"
02600 INTEGER HAD, EXTRA, SPACES, F ; STRING T, SS ;
02700 L ← LINE ; EXTRA ← LENGTH(S) ;
02800 IF XCRIBL THEN
02900 BEGIN TES 11/13/73 FOR MULTI-COLUMNS ;
03000 IF CHAR < (HAD ← LASC[L]) THEN
03100 BEGIN
03200 FAKE[L] ← FAKE[L] + HAD - CHAR ;
03300 HAD ← LASC[L] ← CHAR ;
03400 END
03500 END
03600 ELSE
03700 WHILE CHAR < (HAD ← LASC[L]) DO IF (F←LINK[L]) THEN L ← F ELSE
03800 IF (LINK[L] ← AVAIL←AVAIL+1) > IML+IML THEN WARN("TOO MUCH FOR 1 PAGE: " & S)
03900 ELSE L ← AVAIL ;
04000 T ← IMG[L] ; SPACES ← CHAR - HAD ; HAD ← HAD + FAKE[L] ;
04100 IF LENGTH(T) < HAD+SPACES+EXTRA THEN BEGIN comment no room -- must use concatenate ;
04200 SS ← SPS(SPACES) ; IF DEVICE=MIC THEN FAKE[L] ← FAKE[L] + LENGTH(SS) - SPACES ;
04300 IMG[L] ← IF HAD THEN T[1 TO HAD]&SS&S ELSE (0&SS&S)[2 TO ∞] END
04400 ELSE BEGIN comment there's room in old string -- IDPB into it.;
04500 SS ← T[HAD + 1 FOR 1] ; comment byte pointer to IDPB place ;
04600 START!CODE "APPEND" LABEL LOOP1, LOOP2 ;
04700 MOVE 1, SS ; MOVE 2, S ; MOVE 3, EXTRA ;
04800 MOVE 4, SPACES ; JUMPE 4, LOOP2 ; MOVEI 5, '40 ; LOOP1: IDPB 5,1 ; SOJG 4,LOOP1 ;
04900 LOOP2: ILDB 5, 2 ; IDPB 5, 1 ; SOJG 3, LOOP2 ;
05000 END "APPEND" ;
05100 END ;
05200 RETURN(LASC[L] ← CHAR + EXTRA) ;
05300 END "APPD" ;
05400
05500 SIMPLE PROCEDURE CTRL(STRING S) ;
05600 BEGIN "CTRL"
05700 CHAR ← APPD(S) - LENGTH(S) ;
05800 LASC[L] ← CHAR ;
05900 FAKE[L] ← FAKE[L] + LENGTH(S) ;
06000 END "CTRL" ;
00100 SIMPLE PROCEDURE UNDERSCORE(INTEGER RIGHTCHAR) ;
00200 BEGIN "UNDERSCORE"
00300 INTEGER NUMCHARS, DESCEND, SAVEHORIZ ;
00400 NUMCHARS ← RIGHTCHAR - UNDERLINE ;
00500 IF NUMCHARS > 0 THEN
00600 BEGIN
00700 SAVEHORIZ ← CHORIZ ;
00800 DESCEND ← CCSIZE DIV 4 ;
00900 CTRL( DOLSPCS(CHAR-UNDERLINE) & DOUDOTS(-DESCEND) & DOULINE(NUMCHARS-1) &
01000 SETHORIZ(CCSIZE) & DOULINE(1) & DOLSPCS(1) & SETHORIZ(SAVEHORIZ) &
01100 DOUDOTS(DESCEND) & DORSPCS(CHAR - RIGHTCHAR + 1) ) ;
01200 UNDERLINE ← RIGHTCHAR ;
01300 END ;
01400 END "UNDERSCORE" ;
01500
01600 SIMPLE PROCEDURE CHANGESPACING ;
01700 IF (N←CHRS-CHAR-1)>0 ∧ (K←(J←N*CHORIZ+SHORTM)/N MIN 511)≠CHORIZ THEN
01800 BEGIN "CHANGESPACING"
01900 IF UNDERLINE≥0 THEN UNDERSCORE(CHAR) ;
02000 SHORTM ← J - K*N ;
02100 IF NOTFST ∧ (UNDERLINE<0 ∨ SHORTM<0) THEN
02200 BEGIN DORDOTS(SHORTM) ; SHORTM ← 0 END ;
02300 CTRL(SETHORIZ(K)) ; NOTFST ← TRUE ;
02400 END "CHANGESPACING" ;
02500
02600 SIMPLE PROCEDURE FONTSELECT(INTEGER WHICH);
02700 BEGIN "FONTSELECT"
02800 IF (WHICH←WHICH-"0")>9 THEN WHICH←WHICH-("A"-"0"-10);
02900 IFC VERSION=CMUVER THENC
03000 WHICH←WHICH MOD 9; COMMENT MAKE 1,A 2,B EQUIVALENT;
03100 IF WHICH=1 THEN CTRL(USEA) ELSE
03200 IF WHICH=2 THEN CTRL(USEB) ELSE
03300 WARN("Font ignored")
03400 ELSEC IFC VERSION=SAILVER OR VERSION=ITSVER PJ 5/28/74 ; THENC
03500 IF WHICH>16 THEN WARN("Font ignored") ELSE
03600 BEGIN
03700 CTRL(ESCAPE1&(WHICH-1));
03800 IF SCRLVL THEN CTRL(ESCAPE1&'43&SCRLVL);
03900 END;
04000 ELSEC IFC VERSION=PARCVER THENC
04100 IF WHICH>9 THEN WARN("Font ignored") ELSE
04200 CTRL(6&(THISFONT←WHICH+"0"))
04300 ENDC ENDC ENDC;
04400 END "FONTSELECT";
04500
04600 STRING SIMPLE PROCEDURE XTABSTR(INTEGER N); RKJ: NEW 1-4-74;
04700 BEGIN "XTABSTR"
04800 IFC VERSION=CMUVER THENC RETURN(XTAB&XGPNUM(N)) ENDC
04900 IFC VERSION=SAILVER OR VERSION=ITSVER PJ 5/28/74 ; THENC
05000 RETURN(ESCAPE1&'40&XGPNUM(N))
05100 ENDC
05200 IFC VERSION=PARCVER THEN
05300 RETURN(CTLT&CVS(N)&".")
05400 ENDC;
05500 END "XTABSTR";
05600
05700 SIMPLE PROCEDURE XGPTAB(INTEGER N); RKJ: NEW 1-4-74;
05800 CTRL(XTABSTR(N+TLFTMAR));
05900
06000
06100
06200 STRING PROCEDURE SCNBYCOUNT(INTEGER COUNT) ;
06300 BEGIN
06400 INTEGER I ; STRING S ;
06500 S ← NULL ;
06600 FOR I ← 1 THRU COUNT DO S ← S & SCN(ONE!CHAR) ;
06700 RETURN(S) ;
06800 END ;
06900
07000 SIMPLE STRING PROCEDURE UNMASH(STRING Q) ;
07100 BEGIN TES 8/14/74 PACK EXCESS-64 4-BIT BYTES INTO 7-BIT BYTES ;
07200 STRING S ; S ← NULL ;
07300 WHILE FULSTR(Q) DO S ← S & (((LOP(Q)-64)LSH 4) + (LOP(Q)-64)) ;
07400 RETURN(S) ;
07500 END ;
00100 SIMPLE PROCEDURE RIGHTBOUND ;
00200 BEGIN "RIGHTBOUND" COMMENT RIGHT BOUND OF ∞ ;
00300 INTEGER DEST, FILLIN, I ; STRING FILLER, OLBF ;
00400 INTEGER XF; STRING XTO ; TES 3/30/74;
00500 IF SLIDETOP < 1 THEN BEGIN IMPOSSIBLE("SLIDETOP1") ; SLIDETOP ← 1 END ;
00600 IF LBD[SLIDETOP] < -900 THEN COMMENT FLUSH RIGHT ;
00700 BEGIN
00800 IF XCRIBL THEN
00900 BEGIN
01000 XF←RB[SLIDETOP]-(XFILL[SLIDETOP]+FSIZE);
01100 XTO ← "=" ;
01200 END ;
01300 FILLIN←RB[SLIDETOP]-CHRS;
01400 END
01500 ELSE COMMENT CENTER ;
01600 BEGIN
01700 IF XCRIBL THEN
01800 BEGIN
01900 XF ← (RB[SLIDETOP]-LBD[SLIDETOP]-(XFILL[SLIDETOP]+FSIZE)) DIV 2;
02000 XTO ← "+" ;
02100 END ;
02200 FILLIN ← ((RB[SLIDETOP]-CHRS) DIV 2) MAX 0;
02300 END;
02400 DEST ← CHRS + FILLIN ; OLBF ← LBF[SLIDETOP] ;
02500 IF FULSTR(OLBF) THEN
02600 IF XCRIBL THEN
02700 BEGIN "XGPINFINITY"
02800 FILLER ← NULL ;
02900 FOR I ← 1 THRU XINF[SLIDETOP] DO FILLER ← FILLER & OLBF ;
03000 SEG[I ← SLIDESG[SLIDETOP]] ← FILLER ;
03100 SEG[I + 1] ← RUBOUT & XTO & CVS(XF) ;
03200 END "XGPINFINITY"
03300 ELSE
03400 BEGIN "NON-BLANKS"
03500 FILLER ← NULL ;
03600 WHILE CHRS < DEST DO
03700 BEGIN
03800 FILLER ← FILLER & OLBF ;
03900 CHRS ← CHRS + LENGTH(OLBF) ;
04000 END ;
04100 IF CHRS > DEST THEN FILLER ← FILLER[1 TO ∞-(CHRS-DEST)] ;
04200 SEG[SLIDESG[SLIDETOP]] ← FILLER ;
04300 END "NON-BLANKS"
04400 ELSE SEG[SLIDESG[SLIDETOP]] ← RUBOUT &
04500 (IF XCRIBL THEN (XTO&CVS(XF))
04600 ELSE ("+"&CVS(FILLIN)) );
04700 CHRS ← DEST ; SLIDETOP ← SLIDETOP - 1 ;
04800 BRKS ← 0 ; FSTCHRS ← CHRS ; FSTBRK ← SG ; COMMENT NOJUST TO LEFT ;
04900 FLUSHING ← FALSE ; FSIZE ← 0 ;
05000 END "RIGHTBOUND";
00100 IF PAGEHIGH THEN GO TO CONTINUE ; comment, re-entered ;
00200 AWHILE DO
00300 BEGIN "FILE"
00400 PAGEFILE ← INPUT(SEQCHAN, TO!ALTMODE!SKIP) ; IF SEQEOF THEN DONE ;
00500 IFC TENEX THENC
00600 IFILE ← IFILENAME & OCTEXT & PAGEFILE ;
00700 SFILE ← IFILENAME & TXTEXT & PAGEFILE ;
00800 ELSEC
00900 IFILE ← PAGEFILE & PUIEXT ; SFILE ← PAGEFILE & "S"&PUIEXT ;
01000 ENDC
01100 ICHAN ← READIN(IFILE, TRUE, PAGEBRC, PAGEEOF) ; SCHAN ← READIN(SFILE, FALSE, PAGEBRC, PAGEEOF) ;
01200
01300 AWHILE DO
01400 BEGIN "PAGE"
01500 PAGEHIGH ← INNUM ; IF PAGEEOF ∨ PAGEHIGH≤0 THEN DONE ; PAGEWIDE ← INNUM ;
01600 IFC VERSION=PARCVER OR VERSION=ITSVER THENC LFTMAR ← 0 MAX (188*INNUM)/1000 - 94 ; TES 6/11/74 ADDED ;
01650 COMMENT 188 HORIZ BITS PER INCH, 94 BIT MIN MARGIN;
01700 ELSEC INNUM ENDC ;
01800 COMMENT IF YOU WOULD RATHER USE ODDMARG/EVENMARG INSTEAD OF
01900 !XGPLFTMAR AT YOUR SITE, ADD IT TO ABOVE.
02000 REMEMBER TO CONVERT FROM MILLS TO RASTER UNITS ;
02100 IF PAGEHIGH > IML ∨ PAGEWIDE > IMC THEN
02200 BEGIN "EXPAND"
02300 IF DEVICE=MIC THEN
02400 BEGIN "FRAME SIZE"
02500 IF LASL ≠ 1000 THEN OUT(LISTCHAN, ENDPAGE) ;
02600 NVERTI ← 11000 DIV PAGEHIGH MIN 16384 DIV PAGEWIDE MIN 375 ;
02700 NHORIZ ← 10*NVERTI DIV 11 ; NCSIZE ← (9*NHORIZ DIV 80)*8 ;
02800 OUT(LISTCHAN, SETSIZE(NCSIZE)&SETHORIZ(NHORIZ)&SETVERTI(NVERTI)) ;
02900 END "FRAME SIZE"
03000 IFC VERSION=SAILVER THENC
03100 ELSE IF DEVICE = LPT THEN
03200 BEGIN
03300 IF (LASL-1) MOD 66 + 1 ≤ 6 ∧ (PAGEHIGH-1) MOD 66 < 60 THEN
03400 OUT(LISTCHAN, ENDPAGE) ;
03500 ENDLINE ← IF PAGEHIGH≥54 THEN RUBOUT & '21 ELSE LF ;
03600 END ;
03700 ENDC;
03800 IML ← PAGEHIGH ; IMC ← PAGEWIDE ;
03900 DONE ; comment, Exit "SIZE" block and immediately reenter with bigger IMG array ;
04000 END "EXPAND" ;
04100
04200 CONTINUE: OUTSTR(SP & CVS(PAGECT ← PAGECT + 1)) ; AVAIL ← IML ;
04300 IFC VERSION=SAILVER THENC
04400 IF PAGECT > 1 THEN
04500 IF DEVICE = LPT THEN COMMENT AVOID SPURIOUS BLANK PAGE ;
04600 IF (IML-1) MOD 66 < 60 THEN OUT(LISTCHAN, ENDPAGE)
04700 ELSE FOR L ← (LASL-1) MOD 66 + 2 THRU 66 DO
04800 BEGIN OUT(LISTCHAN, CR) ; OUT(LISTCHAN, ENDLINE) END
04900 ELSE OUT(LISTCHAN, ENDPAGE) ;
05000 ENDC
05100 IFC VERSION=CMUVER THENC
05200 IF PAGECT>1 THEN OUT(LISTCHAN,ENDPAGE);
05300 ENDC
00100 WHILE (TOPLINE ← INNUM) > -10 DO
00200 BEGIN "AREA"
00300 NCOLS ← INNUM ; NLINES ← INNUM ;
00400 FOR COL ← 1 THRU NCOLS DO
00500 BEGIN "COLUMN"
00600 LEFTCH ← INNUM ;
00700 TLFTMAR ← LFTMAR + CHARW*(LEFTCH-1) ; TVR: Initiallize left margin for this column ;
00800 WHILE (LINENO ← INNUM) DO
00900 BEGIN "LINE"
01000 SH ← SHORTM ← INNUM ; SG ← FSTBRK ← -1 ; BRKS ← CHRS ← FSTCHRS ← SLIDETOP ← 0 ;
01100 LINE ← TOPLINE - 1 + LINENO ;
01200 IF LINE<1∨LINE>IML THEN BEGIN WARN("Area outside page"); LINE←LINE MAX 1 MIN IML END ;
01300 L ← INNUM ; F ← L MOD FIML ; OWL ← OWLS[F] ;
01400 IF FULSTR(OWL) THEN BEGIN FROMFILE ← FALSE ; OWLS[F] ← NULL END
01500 ELSE BEGIN FROMFILE ← TRUE ;
01600 WHILE L ≠ (M←CVD(INP(TO!ALTMODE!SKIP))) DO
01700 BEGIN S ← NULL ;
01800 RKJ: 4-26-74, added EOF stuff on next two lines ;
01900 DO S ← S & INP(TO!LF!APPD) UNTIL PAGEBRC = LF OR PAGEEOF ;
02000 IF PAGEEOF THEN USERERR(0,0,"Bad input from Pass One, I give up.");
02100 OWLS[M MOD FIML] ← S ;
02200 END ;
02300 END ;
02400 IF ¬DEBUG THEN S ← SCN(TO!ALTMODE!SKIP)
02500 ELSE BEGIN
02600 SRCREF[LINE] ← SRCREF[LINE] & " " & SCN(TO!RUB!ALT!SKIP) ;
02700 WHILE PAGEBRC ≠ ALTMODE DO
02800 BEGIN "ERROR MESSG"
02900 S ← SCN(TO!RUB!ALT!SKIP) ; M ← LENGTH(S)+3 ; L ← LINE ;
03000 IF DEVICE=TTY ∨ (IMC MAX 75)+13*(NCOLS-COL)+LENGTH(SRCREF[L])+M ≤ 119 THEN
03100 SRCREF[L] ← SRCREF[L] & "..." & S ;
03200 END "ERROR MESSG" ;
03300 END ;
03400 DO BEGIN "PIECE"
03500 CHRS ← CHRS + LENGTH(SEG[SG ← SG + 1] ← SCN(BREAKER)) ;
00100 CASE CHARTBL[PAGEBRC] OF
00200 BEGIN comment by BRC ;
00300
00400 comment 0 ... ; IMPOSSIBLE("BREAKER") ;
00500
00600 comment 1 ... RUBOUT -- Font change ; BEGIN
00700 SEG[SG←SG+1] ← RUBOUT & (F←SCN(ONE!CHAR)) &
00800 (S ← IF F="-" ∨ F="+" ∨ F="=" THEN SCN(TO!ALTMODE!SKIP)
00900 ELSE IF F = "F" THEN SCN(ONE!CHAR)
01000 ELSE IF F="π" THEN SCNBYCOUNT(SCN(ONE!CHAR))
01100 ELSE NULL) ;
01200 IF F = "π" THEN CHRS ← CHRS + 1
01300 ELSE IF F = "+" THEN CHRS ← CHRS + CVD(S)
01400 ELSE IF F = "-" THEN CHRS ← CHRS - CVD(S)
01500 ELSE IF F = "→" THEN
01600 BEGIN COMMENT ∞ ;
01700 IF (SLIDETOP ← SLIDETOP + 1) > 5 THEN IMPOSSIBLE("SLIDETOP") ;
01800 SLIDESG[SLIDETOP] ← SG ; RB[SLIDETOP] ← SCNUM ;
01900 LBD[SLIDETOP] ← SCNUM ;
02000 IF XCRIBL THEN
02100 BEGIN
02200 RKJ; XFILL[SLIDETOP] ← SCNUM ;
02300 TES ; XINF[SLIDETOP] ← SCNUM ;
02400 END ;
02500 LBF[SLIDETOP] ← SCN(TO!ALTMODE!SKIP) ;
02600 IF XCRIBL AND FULSTR(LBF[SLIDETOP]) THEN SG←SG+1 ; RKJ: 1-9-74;
02700 FLUSHING ← TRUE;
02800 END
02900 ELSE IF F = "←" THEN
03000 RIGHTBOUND
03100 ELSE IF F = "=" THEN BEGIN
03200 comment 8/9/73 RKJ IF XCRIBL THEN SHORTM←(SHORTM-BRKS*CHARW) MAX 0;
03300 BRKS←0 ; FSTCHRS←CHRS←CVD(S) ; FSTBRK←SG END ;
03400 END ; COMMENT NOJUST LEFT OF TAB ;
03500
03600 comment 2 ... ALTMODE -- Word Break ; BEGIN BRKS ← BRKS + 1 ; SEG[SG←SG+1] ← ALTMODE END ;
03700
03800 comment 3 ... VT -- label reference ;
03900 BEGIN "LABEL REF"
04000 STRING S;
04100 S ← LABTAB[(F←SCNUM) LSH -14, F LAND '37777] ;
04200 L ← LENGTH(SEG[SG←SG+1] ← SCAN(S, TO!ALTMODE!SKIP, DUMMY)) ;
04300 J ← CVD(S) ;
04400 SHORTM ← SHORTM - (IF XCRIBL THEN J ELSE L) ; CHRS ← CHRS + L ;
04500 IF FLUSHING AND XCRIBL THEN FSIZE←FSIZE+J ;
04600 END "LABEL REF" ;
00100 comment 4 ... CR -- Justify it ;
00200 BEGIN "JUSTIFY"
00300 WHILE SLIDETOP DO BEGIN IMPOSSIBLE("SLIDE TOP") ; RIGHTBOUND END ;
00400 IF SHORTM < 0 THEN SHORTM ← 0 ;
00500 IF DEVICE = MIC THEN SHORTM ← SHORTM*NHORIZ
00600 ELSE BEGIN "DISTRIBUTE SPACES"
00700 COMMENT beta(α,K) = [α(K+1)] - [αK], PJ 5/27/74 ITS doesn't like <control-C>'s
00800 WHERE α = SHORTM/BRKS, is h.m. spaces to insert at the K'th break ;
00900 RATIO ← IF BRKS=0 THEN 0.0 ELSE SHORTM/BRKS ; TERM ← RATIO + .0001 ; BRKS ← 1 ;
01000 END "DISTRIBUTE SPACES" ;
01100 UNDERLINE←-1 ; LINE←TOPLINE-1+LINENO MAX 1 MIN IML ; CHAR←LEFTCH-1 MAX 0 ;
01200 NOTFST ← FALSE ; CHRS ← CHRS + CHAR ;
01300
01400 TVR: Initial column select for XGP ;
01500 IFC VERSION=PARCVER OR VERSION=ITSVER THENC TES 6/11/74 ANYBODY ELSE WANT THIS ;
01600 IF XCRIBL AND (LEFTCH NEQ 1 OR LFTMAR > 0) THEN XGPTAB(0) ELSE
01700 ELSEC
01800 IF XCRIBL AND LEFTCH NEQ 1 THEN XGPTAB(0) ELSE
01900 ENDC
02000
02100 IF DEVICE = MIC AND FSTBRK = -1 THEN CHANGESPACING ;
02200 FOR G ← 0 THRU SG DO IF FULSTR(S ← SEG[G]) THEN CASE CHARTBL[S] OF
02300 BEGIN comment three cases ;
02400
02500 comment 0 ... text ;
02600 BEGIN "TEXT SEG"
02700 IF UNDERLINE<0 OR BAR=0 TES 10/22/73 ; THEN CHAR←APPD(S) ELSE
02800 IF DEVICE = MIC THEN
02900 BEGIN K ← LENGTH(S) ;
03000 WHILE K DO
03100 BEGIN COMMENT DON'T UNDERLINE BLANKS ;
03200 N ← LOP(S) ;
03300 IF N=SP THEN BEGIN UNDERSCORE(CHAR-K) ; UNDERLINE←UNDERLINE+1 END ;
03400 K ← K - 1 ;
03500 END ;
03600 END
03700 ELSE IF XCRIBL THEN
03800 BEGIN
03900 IFC VERSION=CMUVER THENC
04000 K←LENGTH(S); SS←0&SPS(K*4); N←LOP(SS);
04100 START!CODE "XGPUNDER"
04200 DEFINE LEN="2",SRC="3",DEST="4",RUB="5",ESC="6",R="7",CNT="'10",UBAR="'11";
04300 LABEL LOOP,ELOOP,SPACE,OUTT;
04400 SETZ CNT,0; MOVE LEN,K; MOVE SRC,S; MOVE DEST,SS; MOVEI RUB,'177; MOVEI ESC,'35; MOVE UBAR,BAR;
04500 LOOP: ILDB R,SRC;
04600 CAIE R,BAR; CAIN R,SP; JRST SPACE;
04700 IDPB RUB,DEST; IDPB ESC,DEST; IDPB R,DEST; IDPB UBAR,DEST;
04800 ELOOP: SOJG LEN,LOOP;
04900 MOVEM CNT,N; JRST OUTT;
05000 SPACE: IDPB R,DEST;
05100 AOJA CNT,ELOOP;
05200 OUTT:
05300 END "XGPUNDER";
05400 CHAR←APPD(SS[1 TO (K*4-N*3)])-(K-N)*3;
05500 LASC[L]←CHAR; FAKE[L]←FAKE[L]+(K-N)*3;
05600 ENDC
05700 IFC VERSION=SAILVER OR VERSION=ITSVER PJ 5/28/74 ; THENC CHAR←APPD(S); ENDC
05800 IFC VERSION=PARCVER THENC
05900 K←LENGTH(S); SS←0&SPS(K*3); N←LOP(SS);
06000 START!CODE "XGPUNDER"
06100 DEFINE LEN="2",SRC="3",DEST="4",BS="5",UBAR="6",CNT="7",R="'10";
06200 LABEL LOOP, OUTT, NOBAR; TES 8/19/74 TES CHAR BS BAR -> BAR BS CHAR, FOR BOBROW ;
06300 SETZ CNT,0;
06400 MOVE LEN,K; MOVE SRC,S; MOVE DEST,SS; MOVEI BS,'10; MOVE UBAR,BAR;
06500 LOOP: SOJL LEN,OUTT;
06600 ILDB R,SRC;
06800 CAIE R,BAR; CAIN R,SP; AOJA CNT,NOBAR;
06900 IDPB UBAR,DEST; IDPB BS,DEST;
06950 NOBAR: IDPB R,DEST;
07000 JUMPA LOOP;
07100 OUTT: MOVEM CNT,N;
07200 END "XGPUNDER";
07300 CHAR←APPD(SS[1 TO (K*3-N*2)])-(K-N)*2;
07400 LASC[L]←CHAR; FAKE[L]←FAKE[L]+(K-N)*2;
07500 ENDC
07600 END
00100 ELSE BEGIN CHAR ← APPD(S);
00200 K ← LENGTH(S) ; SS ← 0&S ; N ← LOP(SS) ; CHAR←CHAR-K ;
00300 IFC VERSION ≠ CMUVER THENC RKJ: 1-7-74;
00400 START!CODE "UNDER" LABEL LOOP ;
00500 MOVE 2, K ; MOVE 3, SS ;
00600 LOOP: ILDB 4,3 ; CAIE 4,SP ; CAIN 4,BAR ; CAIA 0,0 ; MOVE 4,BAR ; DPB 4,3 ; SOJG 2,LOOP ;
00700 END "UNDER" ; CHAR ← APPD(SS[1 TO LENGTH(S)]) ;
00800 ELSEC CHAR←APPD(S); ENDC RKJ: 1-7-74;
00900 END ;
01000 END "TEXT SEG" ;
01100
01200 comment 1 ... RUBOUT -- Font Change ;
01300 IF (F←S[2 FOR 1])="↑" THEN
01400 IF DEVICE=MIC THEN CTRL(DOUDOTS(CCSIZE MIN 63)) ELSE
01500 IFC VERSION=PARCVER THENC
01600 IF XCRIBL THEN
01700 IF (SCRLVL←SCRLVL+SCRIPT)≤0 THEN CTRL("R"-'100) ELSE
01800 BEGIN LABEL L1;
01900 CTRL("U"-'100);
02000 L1:
02100 IF G<SG THEN
02200 BEGIN
02300 SS←SEG[G+1];
02400 IF NULSTR(SS) THEN BEGIN G←G+1; GO L1 END; comment try again ;
02500 IF EQU(SS[1 FOR 2],RUBOUT&"F") THEN
02600 BEGIN
02700 G←G+1;
02800 CTRL(SS[3 FOR 1]);
02900 END ELSE CTRL(THISFONT);
03000 END ELSE CTRL(THISFONT)
03100 END
03200 ELSE ENDC
03300 IFC VERSION=SAILVER OR VERSION=ITSVER PJ 5/28/74 ; THENC
03400 IF XCRIBL THEN
03500 CTRL(ESCAPE1&'43&(SCRLVL←SCRLVL+SCRIPT))
03600 ELSE ENDC LINE←LINE-1 MAX 1
03700 ELSE IF F = "↓" THEN
03800 IF DEVICE=MIC THEN CTRL(DOUDOTS(-(CCSIZE MIN 63))) ELSE
03900 IFC VERSION=PARCVER THENC
04000 IF XCRIBL THEN
04100 IF (SCRLVL←SCRLVL-SCRIPT)≥0 THEN CTRL("R"-'100) ELSE
04200 BEGIN LABEL L2;
04300 CTRL("S"-'100);
04400 L2:
04500 IF G<SG THEN
04600 BEGIN
04700 SS←SEG[G+1];
04800 IF NULSTR(SS) THEN BEGIN G←G+1; GO L2 END; comment ↑↑↑ ;
04900 IF EQU(SS[1 FOR 2],RUBOUT&"F") THEN
05000 BEGIN
05100 G←G+1;
05200 CTRL(SS[3 FOR 1]);
05300 END ELSE CTRL(THISFONT);
05400 END ELSE CTRL(THISFONT)
05500 END
05600 ELSE ENDC
05700 IFC VERSION=SAILVER OR VERSION=ITSVER PJ 5/28/74 ; THENC
05800 IF XCRIBL THEN
05900 CTRL(ESCAPE1&'43&(SCRLVL←SCRLVL-SCRIPT)) ELSE ENDC LINE←LINE+1 MIN IML
06000 ELSE IF F = "_" THEN
06100 BEGIN
06200 UNDERLINE ← CHAR;
06300 IFC VERSION=SAILVER THENC
06400 IF XCRIBL THEN CTRL(ESCAPE1&'46);
06405 ENDC
06410 IFC VERSION=ITSVER PJ 8/23/74 ; THENC
06420 IF XCRIBL THEN BEGIN CTRL(ESCAPE1&'46); CTRL(ESCAPE1&'46) END;
06430 ENDC
06600 END
06700 ELSE IF F = "≡" THEN
06800 BEGIN "END UNDERLINED TEXT"
06900 IF DEVICE = MIC AND BAR TES 10/22/73; THEN UNDERSCORE(CHAR) ;
07000 UNDERLINE ← -1 ;
07100 IFC VERSION=SAILVER THENC
07200 IF XCRIBL AND BAR TES 10/22/73; THEN
07300 CTRL(ESCAPE1&'47&3); TES AND REG 11/19/73 ;
07400 ENDC
07410 IFC VERSION=ITSVER THENC PJ 8/23/74 ;
07420 IF XCRIBL AND BAR THEN BEGIN CTRL(ESCAPE1&'47&3); CTRL(ESCAPE1&'47&4) END;
07430 ENDC
07500 END "END UNDERLINED TEXT"
07600 ELSE IF F="-" THEN
07700 IF DEVICE=MIC THEN CTRL(DOLSPCS(CVD(S[3 TO ∞])))
07800 ELSE CHAR←CHAR-CVD(S[3 TO ∞]) MAX 0
07900 ELSE IF F="*" THEN CHAR ← LASC[LINE] comment not always correct! ;
08000 ELSE IF F="+" THEN
08100 IF DEVICE=MIC THEN CTRL(DORSPCS(CVD(S[3 TO ∞])))
08200 ELSE IF XCRIBL THEN CTRL(VARBLANK(CVD(S[3 TO ∞])))
08300 ELSE CHAR←CHAR+CVD(S[3 TO ∞]) MIN IMC
08400 ELSE IF F="=" THEN
08500 BEGIN "TAB"
08600 F ← CVD(S[3 TO ∞]) ;
08700 IF NOT XCRIBL THEN F ← (F MAX 0) + LEFTCH - 1 MIN IMC ; TES 8/17/74 FIX BUG ;
08800 IF XCRIBL THEN XGPTAB(F)
08900 ELSE IF DEVICE ≠ MIC THEN CHAR ← F
09000 ELSE IF F < CHAR THEN DOLSPCS(CHAR - F)
09100 ELSE IF F > CHAR THEN DORSPCS(F - CHAR) ;
09200 END "TAB"
09300 ELSE IF F = "π" THEN
09400 BEGIN TES 11/29/73 REWROTE ;
11000 IFC VERSION=CMUVER THENC
11100 IF UNDERLINE GEQ 0 AND BAR THEN CTRL(RUBOUT&'35) ;
11200 ENDC TES 12/13/73 ;
11300 SS ← UNMASH(S[3 TO ∞]) ;
11400 IFC VERSION=PARCVER THENC SS←CTLQ&SS ; ENDC
11500 F ← LENGTH(SS)-1 ; CHAR ← APPD(SS)-F ;
11600 LASC[L] ← CHAR ; FAKE[L] ← FAKE[L] + F ;
11800 IF UNDERLINE≥0 AND BAR ∧ DEVICE≠MIC
11900 IFC VERSION=SAILVER OR VERSION=ITSVER PJ 5/28/74 ; THENC AND NOT XCRIBL ENDC
12000 THEN CTRL(IFC VERSION=PARCVER THENC '10& ENDC BAR) ; TES 12/13/73;
12100 END
12200 ELSE IF F = "←" THEN BEGIN END
00100 ELSE IF F="F" THEN FONTSELECT(S[3 FOR 1])
00200 ELSE IF F='35 THEN COMMENT OVERSTRIKE NEXT CHAR OVER LAST ;
00300 BEGIN "OVERSTRIKE"
00400 IFC VERSION=CMUVER THENC
00500 INTEGER Q;
00600 Q←IMG[L][(LASC[L]+FAKE[L]) FOR 1];
00700 LASC[L]←LASC[L]-1; CHAR←CHAR-1;
00800 CTRL(RUBOUT&'35); CHAR←APPD(Q);
00900 ENDC
01000 IFC VERSION=SAILVER OR VERSION=ITSVER PJ 5/28/74 ; THENC IMPOSSIBLE("Overstrike") ENDC
01100 IFC VERSION=PARCVER THENC
01200 CTRL('10)
01300 ENDC
01400 END
01500 ELSE IF F=RUBOUT THEN IF NOT XCRIBL THEN CHAR←APPD(SP) ELSE
01600 BEGIN
01700 CHAR←APPD(RUBOUT&RUBOUT)-1; LASC[L]←CHAR; FAKE[L]←FAKE[L]+1;
01800 END
01900 ELSE IMPOSSIBLE("FONT `"&F&"'") ;
02000
02100 comment 2 ... ALTMODE -- word break ;
02200 IF SHORTM ∧ G > FSTBRK THEN
02300 IF DEVICE ≠ MIC THEN
02400 BEGIN "SPREAD"
02500 TERMX ← RATIO*(BRKS←BRKS+1) + .0001 ;
02600 IF XCRIBL THEN
02700 BEGIN "DOVSB"
02800 CTRL(VARBLANK((TERMX-TERM) MIN SHORTM));
02900 SHORTM←(SHORTM-TERMX+TERM) MAX 0;
03000 END "DOVSB"
03100 ELSE CHAR ← CHAR + TERMX - TERM MIN IMC ;
03200 TERM ← TERMX ;
03300 END "SPREAD"
03400 ELSE CHANGESPACING
03500 TES 1/7/74 CHANGED... ELSE IF SHORTM AND XCRIBL THEN ... TO: ;
03600 ELSE IF XCRIBL THEN
03700 BEGIN
03800 CHAR←APPD(SP);
03900 END;
04000
04100 comment 3-5 ; IMPOSSIBLE("VT in SEG[]") ; IMPOSSIBLE("CR in SEG[]") ; IMPOSSIBLE("LF in SEG[]") ;
04200 END ; COMMENT three cases ;
04300 IF CHORIZ ≠ NHORIZ THEN CTRL(SETHORIZ(NHORIZ)) ;
04400 IFC VERSION=SAILVER OR VERSION=ITSVER PJ 5/28/74 ; THENC
04500 IF XCRIBL AND UNDERLINE≥0 THEN
04600 CTRL(ESCAPE1&'47&BASELINE);
04700 ENDC
04800 BRKS ← CHRS ← FSTCHRS ← SLIDETOP ← 0 ; SG ← FSTBRK ← -1 ; SHORTM ← SH ;
04900 END "JUSTIFY" ;
00100 comment 5 ... LF ; BEGIN END ;
00200 END ; comment, by BRC ;
00300 END "PIECE"
00400 UNTIL PAGEBRC = LF ;
00500 END "LINE" ;
00600 END "COLUMN" ;
00700 END "AREA" ;
00800
00900 FOR LASL ← PAGEHIGH DOWN 1 DO IF LASC[LASL] THEN DONE ;
01000
01100 F ← 120 - (IMC MAX 78) ;
01200 FOR N ← 1 THRU LASL DO
01300 BEGIN "LIST LINE"
01400 L ← N ; IF DEBUG ∧ LENGTH(S←SRCREF[L])>F ∧ DEVICE=LPT THEN S←S[1 TO F] ;
01500 NEEDCR ← FALSE ; TES 11/1/73 ;
01600 DO BEGIN "PART LINE"
01700 IF M ← LASC[L] THEN
01800 BEGIN "NONBLANK"
01900 IF NEEDCR THEN OUT(LISTCHAN, RESTARTLINE) ELSE NEEDCR ← TRUE ; TES 11/1/73;
02000 OUT(LISTCHAN, IMG[L][1 TO M+FAKE[L]]) ;
02100 IF DEBUG ∧ L=N THEN OUT(LISTCHAN,
02200 (IF XCRIBL THEN XTABSTR(LFTMAR+IMC*CHARW+1) ELSE SPS((IMC MAX 80)-M)) RKJ: 1-4-74;
02300 & S);
02400 END "NONBLANK" ;
02500 M ← L ; L ← LINK[M] ; LINK[M] ← LASC[M] ← FAKE[M] ← 0 ;
02600 END "PART LINE" UNTIL L=0 ;
02700 TES 11/1/73 CHANGED ; OUT(LISTCHAN, CR) ; COMMENT ALWAYS CR BEFORE LF ;
02800 OUT(LISTCHAN, ENDLINE) ;
02900 IF DEBUG THEN SRCREF[N] ← NULL ;
03000 END "LIST LINE" ;
03100
03200 FOR N ← LASL+1 THRU PAGEHIGH DO FAKE[N]←LINK[N]←0 ; TES 4/4/74 ;
03300
03400 IFC VERSION=PARCVER OR VERSION=ITSVER THENC OUT(LISTCHAN, ENDPAGE) ; ENDC
03500
03600 END "PAGE" ;
03700
03800 IF ¬(PAGEEOF ∨ PAGEHIGH≤0) THEN DONE ; comment expand IMG ;
03900 RELEASE(ICHAN) ; RELEASE(SCHAN) ;
04000 END "FILE" ;
04100
04200 END "SIZE" UNTIL SEQEOF ;
04300
04400 IFC VERSION=SAILVER THENC OUT(LISTCHAN, ENDPAGE) ; ENDC
04500
04600 RELEASE(LISTCHAN) ; RELEASE(SEQCHAN) ;
04700 END "INNER BLOCK" ;
00100 BEGIN EXTERNAL SIMPLE PROCEDURE K!OUT ; K!OUT END ; COMMENT ** ** ** ** ** ;
00200
00300 OUTSTR("." & CRLF) ; comment signal terminal that pass two is done ;
00400 IF DELINT="A" ∨ DELINT="a" THEN
00500 BEGIN
00600 OUTSTR(CRLF & "DELETE INTERMEDIATE FILES?(Y OR N,CR)") ;
00700 DELINT ← INCHWL ;
00800 END ;
00900 IF DELINT="Y" ∨ DELINT="y" THEN
01000 BEGIN "DELETE INTERMEDIATE FILES"
01100 IFC TENEX THENC
01200 SIMPLE PROCEDURE DELVER(STRING FINAME) ;
01300 BEGIN INTEGER CHN ;
01400 CHN ← OPENFILE(FINAME&";*", "RO*") ;
01500 DO DELF(CHN) UNTIL NOT INDEXFILE(CHN) ;
01600 RELEASE(CHN) ;
01700 END ;
01800 DELVER(JOBNO & ".PASS2") ;
01900 ENDC
02000 SEQCHAN ← READIN(
02100 IFC TENEX THENC IFILENAME&".FILES" ELSEC "PUPSEQ"&PUIEXT ENDC,
02200 FALSE, SEQBRC, SEQEOF) ;
02300 DO INPUT(SEQCHAN, TO!LF!APPD) UNTIL SEQBRC=LF;
02400 IFC TENEX THENC DELVER(IFILENAME & ".LABELS") ; ELSEC
02500 LABCHAN ← READIN("PULABL"&PUIEXT, FALSE, LABBRC, LABEOF) ;
02600 RENAME(LABCHAN, NULL, 0, I) ;
02700 RELEASE(LABCHAN);
02800 ENDC
02900 AWHILE DO
03000 BEGIN
03100 PAGEFILE ← INPUT(SEQCHAN, TO!ALTMODE!SKIP) ;
03200 IF SEQEOF THEN DONE ;
03300 IFC TENEX THENC
03400 DELVER(IFILENAME & OCTEXT & PAGEFILE) ;
03500 DELVER(IFILENAME & TXTEXT & PAGEFILE) ;
03600 ELSEC
03700 IFILE ← PAGEFILE & PUIEXT ; SFILE ← PAGEFILE & "S"&PUIEXT ;
03800 ICHAN ← READIN(IFILE, TRUE, PAGEBRC, PAGEEOF) ;
03900 SCHAN ← READIN(SFILE, FALSE, PAGEBRC, PAGEEOF) ;
04000 RENAME(ICHAN, NULL, 0, I) ; RENAME(SCHAN, NULL, 0, I) ;
04100 RELEASE(ICHAN); RELEASE(SCHAN);
04200 ENDC
04300 END ;
04400 IFC NOT TENEX THENC RENAME(SEQCHAN, NULL, 0, I) ENDC ;
04500 RELEASE(SEQCHAN) ;
04600 IFC TENEX THENC DELVER(IFILENAME & ".FILES") ; ENDC
04700 END "DELETE INTERMEDIATE FILES"
04800 ELSE IF DELINT≠"N" ∧ DELINT≠"n" THEN
04900 WARN(DELINT&"? -- INTERMEDIATE FILES WERE NOT DELETED") ;
05000
05100 IFC VERSION=SAILVER THENC
05200 IF DEVICE = MIC THEN
05300 BEGIN "PASS 3"
05400 INTEGER FCHAN ;
05500 INTEGER SIMPLE PROCEDURE CORELOC(INTEGER ARRAY A) ; START!CODE MOVE 1, A ; END ;
05600 INTEGER ARRAY PASSTHREE[0:4] ;
05700 FCHAN ← WRITEON("$PUB$"&RPGEXT) ;
05800 OUT(FCHAN, LISTFILE&CRLF&TMPFILE&CRLF&"F"&CRLF&FF) ;
05900 RELEASE(FCHAN) ;
06000 PASSTHREE[0] ← CVSIX("DSK") ;
06100 PASSTHREE[1] ← CVFIL("TXTF80[1,3]", PASSTHREE[2], PASSTHREE[4]) ;
06200 PASSTHREE[3] ← 1 ; COMMENT STARTING ADDRESS IS NORMAL + 1 ;
06300 OUTSTR("PRODUCING FR80 FILE" & CRLF) ;
06400 CALL(CORELOC(PASSTHREE), "SWAP") ;
06500 END "PASS 3" ;
06600 IF XCRIBL THEN LODED("XSPOOL "&LISTFILE&CRLF);
06700 ENDC
06800
06900 IFC VERSION=CMUVER THENC
07000 IF XCRIBL AND DOPASS3 RKJ: 1-4-74; THEN
07100 BEGIN "RUN DOXAP"
07200 INTEGER ARRAY RUNBLK[0:5];
07300 INTEGER C,D;
07400 INTEGER PROCEDURE PJOB;
07500 START!CODE CALLI 1, '30; END;
07600
07700 SETFORMAT(-3,0);
07800 C←WRITEON(CVS(PJOB)&"PB3.TMP");
07900 OUT(C,LISTFILE&CR&LF);
08000 RELEASE(C);
08100
08200 RUNBLK[0]←CVSIX("DSK");
08300 RUNBLK[1]←CVFIL("PUB3[A700PU00]",RUNBLK[2],RUNBLK[4]);
08400 RUNBLK[3]←RUNBLK[5]←0;
08500 START!CODE
08600 MOVE 1, RUNBLK;
08700 HRLI 1, 1;
08800 CALLI 1, '35;
08900 JRST 4, ;
09000 END;
09100 END "RUN DOXAP"
09200 else
09300 while true do
09400 begin "maybererun"
09500 comment
09600 This tests to see if the nnnPUB.TMP file
09700 still exists: if it does, there are more
09800 commands and we rerun PUB. Otherwise we
09900 are done. Each rerun removes one
10000 command from the file, so the procedure is
10100 guaranteed to terminate
10200 Added by Joe Newcomer 7 Apr 74.
10300 ;
10400 integer C,D,ZILCH;
10500 integer array RUNBLK[0:5];
10600 SETFORMAT(-3,0);
10700 D←1;
10800 C←GETCHAN;
10900 if C<0 then done "maybererun";
11000 OPEN(C,"DSK",0,1,0,50,ZILCH,D);
11100 if D then done "maybererun";
11200 LOOKUP(C,CVS(CALL(0,"PJOB"))&"PUB.TMP",D);
11300 if D then done "maybererun";
11400 RUNBLK[0]←CVSIX("SYS");
11500 RUNBLK[1]←CVSIX("PUB");
11600 RUNBLK[2]←RUNBLK[3]←RUNBLK[4]←RUNBLK[5]←0;
11700 start!code "runit"
11800 MOVE 1,RUNBLK;
11900 HRLI 1,1 ;
12000 CALLI 1,'35;
12100 JRST 4,;
12200 end "runit";
12300 end "maybererun";
12400 ENDC
12500
12600 IFC TENEX THENC CALL(1,"EXIT") ; CALL(0,"EXIT") ELSEC
12700 START!CODE IFC VERSION ≠ ITSVER THENC CALLI 1,'12; ENDC CALLI 0,'12; END;
12800 ENDC
12900
13000 END "PUB2" ;